package com.emptyMe.org.service.imp;

import com.emptyMe.basic.utils.*;
import com.emptyMe.org.domain.User;
import com.emptyMe.org.mapper.LoginInfoMapper;
import com.emptyMe.org.mapper.UserMapper;
import com.emptyMe.org.query.LoginInfoQuery;
import com.emptyMe.org.service.IUserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

@Service
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public class UserServiceImpl implements IUserService {
    @Autowired
    private UserMapper mapper;
    @Autowired
    private LoginInfoMapper loginInfoMapper;
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 获取验证码
     *
     * @param phone 手机号
     * @return 返回是否成功及其他信息
     */
    @Override
    public AjaxResult getCode(String phone) {
        User user = mapper.findByPhone(phone);
        if (user != null) {
            return AjaxResult.me(false, "该手机号已被注册过");
        } else {
            // 查询该手机号是否获取过验证码
            String code = (String) redisTemplate.opsForValue().get(phone);
            if (code == null) {
                // 未发送过
                code = CodeUtils.getCode();
                redisTemplate.opsForValue().set(phone, code);
                // 设置过期时间为10分钟
                redisTemplate.expireAt(phone, new Date(System.currentTimeMillis() + 10 * 60 * 1000));
                // 发送验证码
                SMSUtils.sendSMS(phone, code + "，有效期：10分钟");
            } else {
                // 发送过
                // 查看验证码是否过期
                if (redisTemplate.getExpire(phone) < 0) {
                    // 过期了
                    // 重新获取验证码
                    code = CodeUtils.getCode();
                    redisTemplate.opsForValue().set(phone, code);
                    // 设置过期时间为10分钟
                    redisTemplate.expireAt(phone, new Date(System.currentTimeMillis() + 10 * 60 * 1000));
                    // 发送验证码
                    SMSUtils.sendSMS(phone, code + "，有效期：10分钟");
                } else {
                    // 验证码没过期
                    SMSUtils.sendSMS(phone, code + "，有效期：10分钟");
                }
            }
            // 验证码是否过期
            return AjaxResult.me();
        }
    }

    @Override
    @Transactional
    public AjaxResult registerByPhone(LoginInfoQuery query) {
        if (StringUtils.isEmpty(query.getPhone())
                && StringUtils.isEmpty(query.getCode())
                && StringUtils.isEmpty(query.getPassword())
                && StringUtils.isEmpty(query.getRepassword())) {
            return AjaxResult.me(false, "信息填写不完整");
        } else {
            if (!query.getPassword().equals(query.getRepassword())) {
                // 两次密码不一致
                return AjaxResult.me(false, "两次密码不一致");
            } else {
                if (mapper.findByPhone(query.getPhone()) != null) {
                    return AjaxResult.me(false, "该手机号已被注册");
                } else {
                    // 密码一致
                    String code = (String) redisTemplate.opsForValue().get(query.getPhone());
                    // 查看该手机是否存在验证码
                    if (code == null || code.equals("")) {
                        return AjaxResult.me(false, "验证码错误");
                    } else {
                        // 存在验证码
                        // 判断验证码是否过期
                        if (redisTemplate.getExpire(query.getPhone()) > 0) {
                            // 验证码未过期
                            // 判断是否一致
                            if (!code.equals(query.getCode())) {
                                // 验证码不一致
                                return AjaxResult.me(false, "验证码错误");
                            } else {
//                            return AjaxResult.me();
                                query.setType(1);
                                query.setState(1);
                                query.setDisable(1);
                                String salt = StrUtils.getComplexRandomString(32);
                                query.setSalt(salt);
                                query.setPassword(MD5Utils.encrypByMd5(query.getPassword() + "empty" + salt + "me"));
                                loginInfoMapper.save(query);
                                mapper.save(query);
                                return AjaxResult.me();
                            }
                        } else {
                            return AjaxResult.me(false, "验证码已过期，请重新获取");
                        }
                    }
                }
            }
        }
    }

    @Override
    public AjaxResult logout() {
//        redisTemplate.opsForValue().set("token",null);
        redisTemplate.delete("token");
        return AjaxResult.me();
    }

    @Override
    public AjaxResult findByUsername(String username) {
        if (username==null){
            return AjaxResult.me(false,"用户未登录");
        }
        return AjaxResult.me(mapper.findByUsername(username).getId());
    }
}
